/*
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.util;

import java.util.function.Consumer;

/**
 * 此接口表示集合上的迭代器. 在Java集合框架中 {@code Iterator} 替代了
 * {@link Enumeration}. 迭代器在两个方面不同于枚举:
 *
 * <ul>
 *      <li> 迭代器允许调用者在迭代过程中使用定义良好的语义从底层集合中
 *           删除元素
 *      <li> 方法名称已得到改进.
 * </ul>
 *
 * <p>此接口是Java集合框架中的成员
 *
 */
@SuppressWarnings("all")
public interface Iterator<E> {

    // 是否有下一个元素
    boolean hasNext();

    // 获取下一个元素
    E next();


//    如果在迭代过程中直接修改集合（非通过 Iterator 的 remove()），会抛出 ConcurrentModificationException。
//    建议在遍历时使用 Iterator 提供的安全方法。

    // 【Iterator 是唯一可以在遍历过程中安全删除集合元素的工具】
    // 删除最后一个元素。默认是不支持的，因为在很多情况下其结果不可预测，比如数据集合在此时被修改
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    // 对剩下的所有元素进行处理，action则为处理的动作，意为要怎么处理
    // 主要将每个元素作为参数发给action来执行特定操作
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}
